import pyautogui as auto

# =============基础操作=============

# 获取屏幕的尺寸
# 返回一个屏幕的尺寸（x，y）元组
# 像素单位
screenWidth, screenHeight = auto.size()

# 获取一个Image对象，可对其调用Image方法
# (imageFilename=None, region=None)
# imageFilename：文件信息，指定存储位置和名称
# region：区域，指定截取特定位置的图像，eg: region=(0, 0, 300 ,400)
auto.screenshot()

# 判断位置是否在屏幕上
# def onScreen(x, y=None)
# x 可以是一个 tuple，代表 x 和 y
auto.onScreen()

# 获取鼠标位置
# def position(x=None, y=None)
# 返回一个当前光标的屏幕位置
# 传入的 x y 值将会覆盖应有的值
currentMouseX, currentMouseY = auto.position()

# 返回指定位置的 RGB 值
# def pixel(x, y)
auto.pixel()

# 判断指定位置的像素 RGB 值是否符合逾期
# def pixelMatchesColor(x, y, expectedRGBColor, tolerance=0)
# x, y：指定位置的像素
# expectedRGBColor：预设 RGB 值
# tolerance：偏差值
auto.pixelMatchesColor()

# 触发一个鼠标信息程序
# 在关闭程序之前将会阻塞程序的运行
auto.mouseInfo

# 动态显示鼠标的位置信息
# 这个会阻塞程序的运行，知道程序结束
auto.displayMousePosition()

# 倒计时方法，参数为给定倒计时得起始数字
# def countdown(seconds)
auto.countdown()

# 休息方法，参数给定休息多久
# def sleep(seconds)
auto.sleep()

# 获取当前活动的窗口
auto.getActiveWindow()

# 获取当前活动窗口的title
auto.getActiveWindowTitle()

# 获取所有有效窗口的title
auto.getAllTitles()

# 获取所有有效的窗口对象
auto.getAllWindows()

# 获取所有包含 x y 位置的窗口对象
# def getWindowsAt(x, y)
auto.getWindowsAt()

# 获取指定窗口对象
# def getWindowsWithTitle(title)
# title：窗口title
auto.getWindowsWithTitle()

# 获取系统信息
auto.getInfo()

# 打印系统信息
auto.printInfo()

# pyautogui 的一个解释器，可以接受一个指定的 str 为操作命令，
# 通过这个方法可以通过给定一个 '',包含的操作指令
auto.run()

# 全局延迟时间，每个 pyautogui 函数都会间隔这个时间执行
auto.PAUSE = 0.5

# 保护措施，避免失控 pyautogui.FAILSAFE =True
# 鼠标左上角触发 pyautogui.FaailSafeException异常，True是默认值
auto.FAILSAFE = True 

# =============图像识别=============

# 定位特征图在目标图上的位置
# def locate(needleImage, haystackImage, **kwargs)
# needleImage：特征图
# haystackImage：目标图
# **kwargs：置信参数 grayscale=None, limit=10000, region=None, step=1, confidence=0.999
auto.locate()

# 定位特征图在目标图上的所有位置位置
# 参数同上，返回一个迭代器
auto.locateAll()

# 获取图像在屏幕上的位置
# def locateOnScreen(image, minSearchTime=0, **kwargs)
# image：图片路径；支持相对路径
# minSearchTime：最小搜索时间，重复截屏并试图定位匹配的时间，以秒为单位；默认执行一次匹配搜索的时间为 0
# 接受 opencv 参数
auto.locateOnScreen()

# 获取图像在屏幕上的所有位置信息，返回一个迭代器
# def locateAllOnScreen(image, **kwargs)
# image：图片路径；支持相对路径
# **kwargs：grayscale=None, limit=10000, region=None, step=1, confidence=0.999
# grayscale：灰度模式 True or False
# limit：显示个数
# region：区域限定
# step：移动位置
# confidence：相关系数
auto.locateAllOnScreen()

# 定位特定窗口中的图片信息
# def locateOnWindow(image, title, **kwargs)
# image：特征图信息 
# title：窗口标题
# **kwargs：opencv 置信参数 grayscale=None, limit=10000, region=None, step=1, confidence=0.999
auto.locateOnWindow()

# 定位特征图在屏幕上的位置，并返回一个 xy 信息
auto.locateCenterOnScreen()

# =============鼠标操作=============

# 将鼠标移动到指定位置
# def moveTo(x=None, y=None, duration=0.0, tween=linear, logScreenshot=False, _pause=True)
# x：移动位置，默认 none；float 类型会向下取整；tuple 会解析为 xy 位置；str 会解析为特征图名称，使用 locateOnScreen() 进行定位；可以接受一个 position 类型的
# y：移动位置，默认 none；支持 int float position 类型；
# duration：移动速率，指定移动时间，单位 秒
# tween：渐变模式
# logScreenshot：是否开启快照机制，保存当前方法的执行快照
# _pause：废弃参数
# Tps:不建议使用 x 直接放置图片信息，因为他会使用默认的参照系数
auto.moveTo(100, 150)

# 移动鼠标相对位置
# def moveRel(xOffset=None, yOffset=None, duration=0.0, tween=linear, logScreenshot=False, _pause=True)
# xOffset=None, yOffset=None：相对位置
auto.moveRel()

# PyAutoGUI 1.0, move() 代替 moveRel(). 参数保持一致
auto.move()

# 触发鼠标点击操作, 默认是左键
# 指定位置，指定点击键位
# def click(x=None, y=None, clicks=1, interval=0.0, button=PRIMARY, duration=0.0, tween=linear, logScreenshot=None, _pause=True)
# x：触发事件时的位置；string 类型，会认为是特征图名称，通过 locateOnScreen() 方法获取位置，并在中心触发点击；两个数字的序列，会认为是 x 和 y 的集合；默认 none
# y：触发事件时的位置；默认 none
# clicks：指定点击几次；默认 1
# interval：如果点击次数大于 1，指定两次点击之间的间隔，单位 seconds
# button：鼠标按键参数，支持：``LEFT``, ``MIDDLE``, ``RIGHT``, ``PRIMARY``, or ``SECONDARY``，默认是 primary，也就是左键
# duration：当 x y 参数指定时，指定鼠标多久移动到指定位置，单位 seconds
# tween：渐变模式，x y 参数确定且 duration 参数不为 0，选择一种渐变模式进行移动
# logScreenshot：是否开启快照日志，快照为当前方法名称，保存在当前工作目录下
# _pause：已弃用。用来指定两次方法调用之间的间隔时间
auto.click(1020,580,logScreenshot=True)

# 双击
# def doubleClick(x=None, y=None, interval=0.0, button=LEFT, duration=0.0, tween=linear, logScreenshot=None, _pause=True)
# x ：触发事件时鼠标的位置；float 类型会做向下取整；str 会认为是特征图名称，通过 locateOnScreen() 方法获取位置，并在中心触发点击；默认 None
# y ：触发事件时鼠标的位置；默认 None
# interval：两次点击之间的间隔；默认 0.0，即没有暂停
# button：鼠标发布的键位；接受：'left', 'middle', 'right', 1, 2, 3, 4, 5, 6, 7；默认左键
auto.doubleClick()

# 参数同上，点击三次
auto.tripleClick()

# 鼠标左击一次
# def leftClick(x=None, y=None, interval=0.0, duration=0.0, tween=linear, logScreenshot=None, _pause=True)
auto.leftClick()

# 鼠标右击一次
# def rightClick(x=None, y=None, interval=0.0, duration=0.0, tween=linear, logScreenshot=None, _pause=True)
auto.rightClick()

# 鼠标中键点击一次
# def middleClick(x=None, y=None, interval=0.0, duration=0.0, tween=linear, logScreenshot=None, _pause=True)
auto.middleClick()

# 按下鼠标上的指定键位
# def mouseDown(x=None, y=None, button=PRIMARY, duration=0.0, tween=linear, logScreenshot=None, _pause=True)
# xy：指定位置
# button：指定键位
auto.mouseDown()

# 执行鼠标按键的向上操作（但不会执行按下操作）
# def mouseUp(x=None, y=None, button=PRIMARY, duration=0.0, tween=linear, logScreenshot=None, _pause=True)
auto.mouseUp()

# 移动或者拖动鼠标
# def _mouseMoveDrag(moveOrDrag, x, y, xOffset, yOffset, duration, tween=linear, button=None)
# moveOrDrag：字符参数，接受 'move' or 'drag' 两种参数，非法参数会提示错误信息
# button：指定鼠标按键
auto._mouseMoveDrag()

# 指定鼠标的滚轮滚动
# def scroll(clicks, x=None, y=None, logScreenshot=None, _pause=True)
# clicks：滚动量，像素
# x=None, y=None：鼠标的位置
auto.scroll()

# 水平滚动操作（只支持Linux系统）
# def hscroll(clicks, x=None, y=None, logScreenshot=None, _pause=True)
auto.hscroll()

# 垂直滚动操作（只支持Linux系统）
# def vscroll(clicks, x=None, y=None, logScreenshot=None, _pause=True)
auto.vscroll()

# 设置鼠标移动的渐变系数
# def linear(n)
# 0.0 <= n <= 1.0
auto.linear()

# =============键盘操作=============

# 默认的键盘符，同 auto.KEY_NAMES
# 可以用于校验是否合法输入
# 可以新增或修改已有键位符
auto.KEYBOARD_KEYS

# 松开指定键位（只有松开操作，没有按下操作）
# def keyUp(key, logScreenshot=None, _pause=True)
# key：键位符
auto.keyUp()

# 按下指定键位
# def keyDown(key, logScreenshot=None, _pause=True)
# key：键位符
# logScreenshot：是否开启截图日志
auto.keyDown()

# 操作一个按键（包括按下和释放）
# def press(keys, presses=1, interval=0.0, logScreenshot=None, _pause=True)
# key：键位符
# presses：操作次数，默认 1
# interval：间隔时长，单位秒
auto.press()

# 按下指定键位
# def hold(keys, logScreenshot=None, _pause=True)
# keys:键位符列表
# eg: auto.hold('shift'):auto.press('left','left')
# 按下 shift 按键，并在两次触发 left 按键之后释放
auto.hold()

# 组合按键
# def hotkey(keys, interval=0.0, logScreenshot=None)
# keys：键位符列表，按顺序按下，反序释放
# interval：间隔时间，秒
# logScreenshot：是否开启截图日志
auto.hotkey()

# 按照 message 中的信息触发键位，不支持中文
# def typewrite(message, interval=0.0, logScreenshot=None, _pause=True)
# message:如果是字符串，则要按的字符。如果列表，然后按顺序按按键的键名
# interval:输入间隔
auto.typewrite()

# 判断是否是 pyautogui 支持的键盘符号
# def isValidKey(key)
auto.isValidKey()

# 按键是否需要按住 shift 键位
# def isShiftCharacter(character)
auto.isShiftCharacter()

# =============窗口操作=============

# 一个简单的弹窗
# def alert( text="", title="", button=pymsgbox.OK_TEXT, root=None, timeout=None, icon=NO_ICON, _tkinter=False)
# text：文本信息
# title：窗口的标题信息
# button：提供的按钮；可以选择：OK Cancel Yes No Retry Abort Ignore ‘Try Again’ Continue Timeout
# root：基于那个窗口上
# timeout：超时关闭,毫秒
# icon：显示按钮的模式
# 只有 button 为 OK 时会调用 Windows 的窗口，其他都会调用 tkinter 的窗口显示
# 返回：窗口状态
auto.alert()

# 一个简单的选择弹框
# def confirm( text="", title="", buttons=(pymsgbox.OK_TEXT, pymsgbox.CANCEL_TEXT), root=None, timeout=None, icon=QUESTION, _tkinter=False)
# buttons：接受一个数组，作为按钮显示，点击之后放回对应的描述
auto.confirm()

# 一个文字输入窗口
# def prompt(text="", title="", default="", root=None, timeout=None)
auto.prompt()

# 一个密码输入窗口
# def password(text="", title="", default="", mask="*", root=None, timeout=None)
# mask：掩码
auto.password()







